home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / libs / hobbes3 / pcx.c < prev    next >
C/C++ Source or Header  |  1992-08-17  |  2KB  |  101 lines

  1. #include<stdio.h>
  2. #include<alloc.h>
  3. #include "hobbes.h"
  4. #include "pcx.h"
  5.  
  6. void PCXReadLine(FILE *fptr, PCXHeader *header, int posX, int posY);
  7. //void DecodeMonoPCX(FILE *fptr, PCXHeader *header);
  8. //void Decode16PCX(FILE *fptr, PCXHeader *header);
  9. void Decode256PCX(FILE *fptr, PCXHeader *header, int, int);
  10.  
  11. extern TScreen *Screen;
  12.  
  13. BOOL PCX_Read(char *fname)
  14. {
  15.     FILE *fptr;
  16.     PCXHeader header;
  17.     int height, width;
  18.     int test;
  19.  
  20.     if ((fptr = fopen(fname,"rb")) == NULL)
  21.         return FALSE;
  22.  
  23.     fseek(fptr,0,SEEK_END);
  24.     test = ftell(fptr);
  25.     fseek(fptr,0,SEEK_SET);
  26.     test = fread(&header, sizeof(PCXHeader), 1, fptr);
  27.     test = ftell(fptr);
  28.  
  29. //    if (header.Manufacturer != 0x0a)
  30. //        return FALSE;
  31.  
  32.     width  = header.Xmax - header.Xmin + 1;
  33.     height = header.Ymax - header.Ymin + 1;
  34.  
  35.  
  36.     if (header.BitsPixel == 8 && header.NPlanes == 1)
  37.         Decode256PCX(fptr, &header, width, height);
  38. /*
  39.       else
  40.     if (header.BitsPixel == 1 && header.NPlanes == 4)
  41.         Decode16PCX(fptr, &header);
  42.       else
  43.     if (header.BitsPixel == 1 && header.NPlanes == 1)
  44.         DecodeMonoPCX(fptr, &header);
  45. */
  46.       else
  47.         return FALSE;
  48.  
  49.     fclose(fptr);
  50.     return TRUE;
  51. }
  52.  
  53.  
  54. void Decode256PCX(FILE *fptr, PCXHeader *header, int width, int height) {
  55.  
  56.     int pX=0;
  57.     int pY=0;
  58.  
  59.     for (pY=0; pY<height; pY++) {
  60.         PCXReadLine(fptr, header, pX, pY);
  61.         }
  62.  
  63.     // Load palette, if necessary
  64.     fseek(fptr,769,SEEK_END);
  65.     if (fgetc(fptr) == 0xc) {
  66.         for(int i=0;i<256;i++) {
  67.             Set1Palette(i,fgetc(fptr),fgetc(fptr),fgetc(fptr));
  68.             }
  69.         }
  70.  
  71.  
  72. }
  73.  
  74.  
  75.  
  76. void PCXReadLine(FILE *fptr, PCXHeader *header, int posX, int posY)
  77. {
  78.     int data,
  79.         count,
  80.         offset=0;
  81.  
  82.     while (offset < header->BytesLine) {
  83.         data = getc(fptr);
  84.  
  85.         if ((data & 0xC0) == 0xC0) {
  86.             count = data & 0x3f;
  87.             data = getc(fptr);
  88.             Screen->HLine(posX, posX+count, posY, data);
  89.             posX += count;
  90.             offset += count;
  91.             }
  92.         else {
  93.             Screen->Pixel(posX, posY, data);
  94.             offset++;
  95.             posX++;
  96.             }
  97.         }
  98. }
  99.  
  100.  
  101.